
<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="zh_cn">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   
      <title>5.5.&nbsp;&#26696;&#20363;&#65306;Dumb Quotes [&#28145;&#20837;&#27973;&#20986; Greasemonkey]</title>
      <link rel="shortcut icon" href="/favicon.ico">
      <link rel="stylesheet" href="../css/dig.css" type="text/css">
      <meta http-equiv="Link" content='&lt;../css/modern.css&gt;; type="text/css"; rel=stylesheet, &lt;../css/empty.css&gt;; type="text/css";
      rel=stylesheet'>
      <link rev="made" href="mailto:mark@diveintomark.org">
      <meta name="generator" content="DocBook XSL Stylesheets V1.68.1">
      <meta name="keywords" content="Firefox, Greasemonkey, Javascript, user script, userscript">
      <link rel="start" href="../toc/index.html" title="&#28145;&#20837;&#27973;&#20986; Greasemonkey">
      <link rel="up" href="index.html" title="&#31532;&nbsp;5&nbsp;&#31456;&nbsp;&#23454;&#20363;&#25945;&#23398;">
      <link rel="prev" href="offsiteblank.html" title="5.4.&nbsp;&#26696;&#20363;&#65306;Offsite Blank">
      <link rel="next" href="frownies.html" title="5.6.&nbsp;&#26696;&#20363;&#65306;Frownies">
   </head>
   <body id="diveintogreasemonkey-org" class="casestudy-dumbquotes">
      <div class="z" id="intro">
         <div class="sectionInner">
            <div class="sectionInner2">
               <div class="s">
                  <h1><a href="/" accesskey="1">&#28145;&#20837;&#27973;&#20986; Greasemonkey</a></h1>
                  <p>&#25945;&#32769;&#32593;&#32476;&#23398;&#26032;&#25226;&#25103;</p>
               </div>
               <div class="s">
                  <ul>
                     <li><a href="../">&#36215;&#22987;&#39029;</a> &middot; 
                     </li>
                     <li><a href="../toc/">&#30446;&#24405;</a> &middot; 
                     </li>
                     <li><a href="../download/">&#19979;&#36733;</a> &middot; 
                     </li>
                     <li><a href="http://greasemonkey.mozdev.org/">&#31435;&#21363;&#19979;&#36733; Greasemonkey</a></li>
                  </ul>
               </div>
            </div>
         </div>
      </div>
      <div id="main">
         <div id="mainInner">
            <p id="breadcrumb">&#24744;&#30340;&#20301;&#32622;&#65306;<a href="../">&#36215;&#22987;&#39029;</a> &#8594; <a href="../toc/index.html">&#30446;&#24405;</a> &#8594; <a href="index.html">&#23454;&#20363;&#25945;&#23398;</a> &#8594; <span class="thispage">&#26696;&#20363;&#65306;Dumb Quotes</span></p>
            <div class="section" lang="zh_cn">
               <div class="titlepage">
                  <div>
                     <div>
                        <h2 class="title"><a name="casestudy.dumbquotes" class="skip" href="#casestudy.dumbquotes" title="link to this section"><img src="../images/permalink.gif" alt="[link]" title="link to this section" width="8" height="9"></a> 5.5.&nbsp;&#26696;&#20363;&#65306;Dumb Quotes
                        </h2>
                     </div>
                     <div>
                        <h3 class="subtitle">&#36716;&#25442;&#26234;&#33021;&#24341;&#21495;&#20026;&#21407;&#22987;&#24341;&#21495;</h3>
                     </div>
                     <div>
                        <div class="abstract">
                           <h3 class="title"></h3>
                           <p>DumbQuotes &#26159;&#24212;&#35768;&#22810;&#32593;&#32476;&#21338;&#23458;&#30340;&#38656;&#35201;&#32780;&#29983;&#30340;&#65306;&#22823;&#22810;&#25968;&#20986;&#29256;&#36719;&#20214;&#21487;&#20197;&#33258;&#21160;&#36716;&#25442;&#30452;&#25509;&#30340; ASCII &#24341;&#21495;&#20026; &#8220;<span class="quote">&#26234;&#33021;&#24341;&#21495;(smart quotes)</span>&#8221;&#65292;&#20294;&#26159;&#24403;&#20316;&#32773;&#22312;&#25991;&#31456;&#20013;&#22797;&#21046;&#31896;&#36148;&#25991;&#26412;&#26102;&#65292;&#21516;&#26679;&#26159;&#36825;&#20123;&#36719;&#20214;&#22788;&#29702;&#8220;<span class="quote">&#26234;&#33021;&#24341;&#21495;</span>&#8221;&#21364;&#24456;&#24858;&#31528;&#12290;&#24120;&#35265;&#30340;&#20363;&#23376;&#26159;&#21338;&#23458;&#24819;&#24341;&#29992;&#20854;&#20182;&#32593;&#31449;&#30340;&#19968;&#27573;&#25991;&#23383;&#12290;&#22312;&#27983;&#35272;&#22120;&#20013;&#36873;&#20013;&#20960;&#21477;&#65292;&#31896;&#36148;&#21040;&#33258;&#24049;&#32593;&#31449;&#30340;&#34920;&#21333;&#20013;&#25552;&#20132;&#65292;&#36825;&#27573;&#25991;&#23383;&#21364;&#30475;&#36215;&#26469;&#23436;&#20840;&#19981;&#21516;&#65292;&#22240;&#20026;&#20182;&#20204;&#30340;&#20986;&#29256;&#36719;&#20214;&#27809;&#26377;&#22788;&#29702;&#22909;&#23383;&#31526;&#32534;&#30721;&#12290;
                           </p>
                        </div>
                     </div>
                  </div>
               </div>
               <p>&#24403;&#28982;&#65292;&#25105;&#19981;&#33021;&#20462;&#22797;&#19990;&#30028;&#19978;&#27599;&#20010;&#20986;&#29256;&#31995;&#32479;&#65292;&#20294;&#26159;&#25105;&#21487;&#20197;&#20026;&#33258;&#24049;&#20889;&#20010;&#29992;&#25143;&#33050;&#26412;&#26469;&#35299;&#20915;&#65292;&#33258;&#21160;&#36716;&#25442;&#26234;&#33021;&#24341;&#21495;&#21644;&#20854;&#20182;&#26377;&#38382;&#39064;&#30340;&#39640;&#20301;&#23383;&#31526;&#20026;&#31561;&#21516;&#30340;7&#20301; ASCII &#23383;&#31526;&#12290;</p>
               <div class="example"><a name="example.casestudy.dumbquotes" class="skip" href="#example.casestudy.dumbquotes" title="link to this example"><img src="../images/permalink.gif" alt="[link]" title="link to this example" width="8" height="9"></a> 
                  <h3 class="title">&#20363;&nbsp;5.5.&nbsp;
                     <a href="http://www.firefox.net.cn/dig/download/dumbquotes.user.js" title="Download Dumb Quotes">
                        <code class="filename">dumbquotes.user.js</code>
                        </a>
                     
                  </h3><pre class="programlisting ">// ==UserScript==
// @name          DumbQuotes
// @namespace     http://diveintogreasemonkey.org/download/
// @description   straighten curly quotes and apostrophes, simplify fancy dashes, etc.
// @include       *
// ==/UserScript==

var replacements, regex, key, textnodes, node, s;

replacements = {
	"\xa0": " ",
	"\xa9": "(c)",
	"\xae": "(r)",
	"\xb7": "*",
	"\u2018": "'",
	"\u2019": "'",
	"\u201c": '"',
	"\u201d": '"',
	"\u2026": "...",
	"\u2002": " ",
	"\u2003": " ",
	"\u2009": " ",
	"\u2013": "-",
	"\u2014": "--",
	"\u2122": "(tm)"};
regex = {};
for (key in replacements) {
	regex[key] = new RegExp(key, 'g');
}

textnodes = document.evaluate(
	"//text()",
	document,
	null,
	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
	null);
for (var i = 0; i &lt; textnodes.snapshotLength; i++) {
	node = textnodes.snapshotItem(i);
	s = node.data;
	for (key in replacements) {
		s = s.replace(regex[key], replacements[key]);
	}
	node.data = s;
}</pre></div>
               <p>&#36825;&#27573;&#20195;&#30721;&#20998;&#20026;&#22235;&#20010;&#27493;&#39588;&#65306;</p>
               <div class="orderedlist">
                  <ol type="1">
                     <li>&#20808;&#23450;&#20041;&#23383;&#31526;&#26367;&#25442;&#35268;&#21017;&#21015;&#34920;&#65292;&#26144;&#23556;&#26576;&#20123;8&#20301;&#23383;&#31526;&#21040;&#23545;&#24212;&#30340;7&#20301;&#23383;&#31526;&#12290;</li>
                     <li>&#33719;&#21462;&#24403;&#21069;&#39029;&#38754;&#20013;&#30340;&#25152;&#26377;&#25991;&#23383;&#32467;&#28857;&#12290;</li>
                     <li>&#36941;&#21382;&#25991;&#23383;&#32467;&#28857;&#28165;&#21333;&#12290;</li>
                     <li>&#22312;&#27599;&#20010;&#25991;&#23383;&#32467;&#28857;&#20013;&#65292;&#26367;&#25442;&#27599;&#20010;8&#20301;&#23383;&#31526;&#20026;&#31561;&#20215;&#30340;7&#20301;&#23383;&#31526;&#12290;</li>
                  </ol>
               </div>
               <p>&#31532;&#19968;&#27493;&#20854;&#23454;&#26159;&#20004;&#27493;&#12290;Javascript &#30340;&#23383;&#31526;&#20018;&#26367;&#25442;&#22522;&#20110;&#27491;&#21017;&#34920;&#36798;&#24335;&#12290;&#25152;&#20197;&#35201;&#26367;&#25442;8&#20301;&#23383;&#31526;&#20026;&#31561;&#20215;&#30340;7&#20301;&#23383;&#31526;&#65292;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#27491;&#21017;&#34920;&#36798;&#24335;&#38598;&#21512;&#12290;</p>
               <div class="informalexample"><pre class="programlisting ">replacements = {
	"\xa0": " ",
	"\xa9": "(c)",
	"\xae": "(r)",
	"\xb7": "*",
	"\u2018": "'",
	"\u2019": "'",
	"\u201c": '"',
	"\u201d": '"',
	"\u2026": "...",
	"\u2002": " ",
	"\u2003": " ",
	"\u2009": " ",
	"\u2013": "-",
	"\u2014": "--",
	"\u2122": "(tm)"};
regex = {};
for (key in replacements) {
	regex[key] = new RegExp(key, 'g');
}</pre><p>&#25105;&#20351;&#29992;&#33457;&#25324;&#21495;&#35821;&#27861;&#36805;&#36895;&#24314;&#31435;&#20102;&#19968;&#20010;&#20851;&#32852;&#25968;&#32452;&#12290;&#31561;&#20215;&#20110;(&#20294;&#26159;&#38190;&#20837;&#26356;&#23569;)&#21333;&#29420;&#25226;&#27599;&#20010;&#20851;&#38190;&#23383;&#21644;&#20540;&#23545;&#24212;&#36215;&#26469;&#65306;</p><pre class="programlisting ">replacements["\xa0"] = " ";
replacements["\xa9"] = "(c)";
replacements["\xae"] = "(r)";
// &#31561;&#31561;</pre><p>&#27599;&#20010;8&#20301;&#30340;&#23383;&#31526;&#37117;&#26159;&#29992;&#21313;&#20845;&#36827;&#21046;&#20540;&#34920;&#31034;&#30340;&#65292;&#26159;&#29992;&#20102;&#36867;&#36920;&#35821;&#27861;(escaping syntax)<code class="literal">"\xa0"</code> &#25110; <code class="literal">"\u2018"</code>&#12290;&#25105;&#20204;&#23436;&#25104;&#23383;&#31526;&#21040;&#23383;&#31526;&#20018;&#30340;&#20851;&#32852;&#25968;&#32452;&#21518;&#65292;&#25105;&#20250;&#36941;&#21382;&#25972;&#20010;&#25968;&#32452;&#65292;&#28982;&#21518;&#24314;&#31435;&#27491;&#21017;&#34920;&#36798;&#24335;&#23545;&#35937;&#21015;&#34920;&#12290;&#27599;&#20010;&#27491;&#21017;&#34920;&#36798;&#24335;&#23545;&#35937;&#20250;&#22312;&#20840;&#23616;&#33539;&#22260;&#25628;&#32034;8&#20301;&#23383;&#31526;&#12290;(&#31532;&#20108;&#20010;&#21442;&#25968; <em class="parameter"><code>'g'</code></em> &#24847;&#20041;&#20026;&#20840;&#23616;&#25628;&#32034;&#65307;&#21542;&#21017;&#27599;&#20010;&#27491;&#21017;&#34920;&#36798;&#24335;&#21482;&#20250;&#25628;&#32034;&#21644;&#26367;&#25442;&#31532;&#19968;&#27425;&#20986;&#29616;&#30340;&#29305;&#23450;8&#20301;&#23383;&#31526;&#65292;&#36825;&#26679;&#25105;&#21487;&#33021;&#20250;&#28431;&#25481;&#24456;&#22810;&#12290;)
                  </p>
               </div>
               <p>&#19979;&#19968;&#27493;&#26159;&#33719;&#21462;&#24403;&#21069;&#25991;&#26723;&#20013;&#30340;&#20840;&#37096;&#25991;&#26412;&#33410;&#28857;&#12290;&#24744;&#21487;&#20197;&#38750;&#24120;&#24819;&#35828;&#65292;&#8220;<span class="quote">&#21992;&#65292;&#25105;&#21482;&#35201;&#29992; <code class="property">document.body.innerHTML</code> &#23601;&#24471;&#21040;&#20840;&#37096;&#39029;&#38754;&#30340;&#23383;&#31526;&#20018;&#65292;&#28982;&#21518;&#25628;&#32034;&#26367;&#25442;&#23601;&#25104;&#20102;&#12290;</span>&#8221;
                  
               </p>
               <div class="informalexample"><pre class="programlisting ">var tmp = document.body.innerHTML;
// &#22312; tmp &#19978;&#23436;&#25104;&#19968;&#25209;&#25628;&#32034;&#21644;&#26367;&#25442;
document.body.innerHTML = tmp;</pre></div>
               <p>&#20294;&#36825;&#26159;&#20010;&#22351;&#20064;&#24815;&#65292;&#22240;&#20026; <code class="property">innerHTML</code> &#20250;&#36820;&#22238;&#39029;&#38754;&#20013;&#30340;&#20840;&#37096;&#28304;&#20195;&#30721;&#65306;&#25152;&#26377;&#30340;&#26631;&#31614;&#12289;&#25152;&#26377;&#30340;&#33050;&#26412;&#12289;&#25152;&#26377;&#30340;&#23646;&#24615;&#31561;&#31561;&#12290;&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;,&#26377;&#21487;&#33021;&#19981;&#20250;&#36896;&#25104;&#38382;&#39064;(<acronym title="HyperText Markup Language">HTML</acronym> &#26631;&#31614;&#24182;&#19981;&#21253;&#21547;8&#20301;&#23383;&#31526;)&#65292;&#20294;&#23427;&#22312;&#20854;&#20182;&#24773;&#20917;&#19979;&#19981;&#22570;&#35774;&#24819;&#65292;&#24456;&#38590;&#35843;&#35797;&#12290;&#20320;&#35201;&#38382;&#20320;&#33258;&#24049;&#21040;&#24213;&#35201;&#25628;&#32034;&#21644;&#26367;&#25442;&#20160;&#20040;&#12290;&#22914;&#26524;&#31572;&#26696;&#26159;&#8220;<span class="quote">&#21407;&#22987;&#30340;&#39029;&#38754;&#28304;&#20195;&#30721;</span>&#8221;&#65292;&#37027;&#20040;&#23601;&#21435;&#20351;&#29992; <code class="property">innerHTML</code>&#12290;&#28982;&#32780;&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#31572;&#26696;&#26159;&#8220;<span class="quote">&#20840;&#37096;&#30340;&#39029;&#38754;&#25991;&#23383;</span>&#8221;&#65292;&#25152;&#20197;&#27491;&#30830;&#30340;&#26041;&#27861;&#26159;&#20351;&#29992; XPath &#26597;&#35810;&#33719;&#21462;&#25152;&#26377;&#25991;&#26412;&#33410;&#28857;&#12290;
               </p>
               <div class="informalexample"><pre class="programlisting ">textnodes = document.evaluate(
	"//text()",
	document,
	null,
	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
	null);</pre><p>&#36825;&#37324;&#20351;&#29992;&#20102; XPath &#20989;&#25968;&#65292;<code class="function">text()</code>&#65292;&#29992;&#26469;&#21305;&#37197;&#20219;&#24847;&#25991;&#26412;&#33410;&#28857;&#12290;&#24744;&#21487;&#33021;&#23545;&#26597;&#35810;&#20803;&#32032;&#33410;&#28857;&#24456;&#29087;&#24713;&#20102;&#65306;&#25152;&#26377; <code class="sgmltag-element">&lt;a&gt;</code> &#20803;&#32032;&#38598;&#65292;&#25110;&#32773;&#25152;&#26377;&#20855;&#26377; <code class="sgmltag-attribute">alt</code> &#23646;&#24615;&#30340; <code class="sgmltag-element">&lt;img&gt;</code> &#20803;&#32032;&#38598;&#12290;&#20294;&#26159; DOM &#20063;&#21253;&#21547;&#26377;&#33410;&#28857;&#20013;&#23384;&#22312;&#30340;&#25991;&#26412;&#20869;&#23481;&#12290;(&#20063;&#26377;&#20854;&#20182;&#31867;&#22411;&#30340;&#33410;&#28857;&#65292;&#20363;&#22914;&#27880;&#37322;&#21644;&#22788;&#29702;&#25351;&#20196;&#12290;)&#29616;&#22312;&#23427;&#20063;&#26159;&#25105;&#20204;&#24863;&#20852;&#36259;&#30340;&#25991;&#26412;&#33410;&#28857;&#12290;
                  </p>
               </div>
               <p>&#31532;3&#27493;&#26159;&#36941;&#21382;&#25152;&#26377;&#25991;&#26412;&#33410;&#28857;&#12290;&#36825;&#23436;&#20840;&#36319;&#36941;&#21382;&#20687; <code class="literal">//a[@href]</code> XPath &#26597;&#35810;&#36820;&#22238;&#30340;&#33410;&#28857;&#38598;&#19968;&#26679;&#65307;&#21807;&#19968;&#30340;&#19981;&#21516;&#23601;&#26159;&#36941;&#21382;&#20013;&#30340;&#26159;&#25991;&#26412;&#33410;&#28857;&#65292;&#32780;&#19981;&#26159;&#20803;&#32032;&#33410;&#28857;&#12290;
               </p>
               <div class="informalexample"><pre class="programlisting ">for (var i = 0; i &lt; textnodes.snapshotLength; i++) {
node = textnodes.snapshotItem(i);
s = node.data;
// &#20570;&#26367;&#25442;&#25805;&#20316;
node.data = s;</pre><p>
                     <code class="varname">node</code> &#26159;&#24490;&#29615;&#20013;&#30340;&#24403;&#21069;&#25991;&#26412;&#33410;&#28857;&#65292;&#32780; <code class="varname">s</code> &#26159; <code class="varname">node</code> &#20013;&#23384;&#22312;&#25991;&#26412;&#30340;&#23383;&#31526;&#20018;&#21464;&#37327;&#12290;&#25105;&#25171;&#31639;&#20351;&#29992; <code class="varname">s</code> &#23436;&#25104;&#26367;&#25442;&#25805;&#20316;&#65292;&#28982;&#21518;&#25226;&#22788;&#29702;&#32467;&#26524;&#22797;&#21046;&#22238;&#21407;&#22987;&#33410;&#28857;&#20013;&#12290;
                  </p>
               </div>
               <p>&#25152;&#20197;&#29616;&#22312;&#25105;&#26377;&#20102;&#21333;&#20010;&#33410;&#28857;&#30340;&#25991;&#26412;&#65292;&#25105;&#38656;&#35201;&#23436;&#25104;&#26367;&#25442;&#25805;&#20316;&#12290;&#22240;&#20026;&#25105;&#24050;&#32463;&#24314;&#22909;&#20102;&#27491;&#21017;&#34920;&#36798;&#24335;&#21015;&#34920;&#21644;&#26367;&#25442;&#23383;&#31526;&#20018;&#21015;&#34920;&#65292;&#25152;&#20197;&#36825;&#30456;&#23545;&#31616;&#21333;&#12290;</p>
               <div class="informalexample"><pre class="programlisting ">    for (key in replacements) {
s = s.replace(regex[key], replacements[key]);
}</pre></div>
               <div class="download">
                  <h3>&#19979;&#36733;</h3>
                  <ul>
                     <li>
                        <a href="http://www.firefox.net.cn/dig/download/dumbquotes.user.js">
                           <code class="filename">dumbquotes.user.js</code>
                           </a>
                        
                     </li>
                  </ul>
               </div>
               <div class="seealso">
                  <h3>&#21442;&#35265;</h3>
                  <ul>
                     <li>
                        <a href="../patterns/match-attribute.html" title="4.6.&nbsp;&#25805;&#20316;&#25152;&#26377;&#26377;&#29305;&#23450;&#23646;&#24615;&#30340;&#20803;&#32032;">&#25805;&#20316;&#25152;&#26377;&#26377;&#29305;&#23450;&#23646;&#24615;&#30340;&#20803;&#32032;</a>
                        
                     </li>
                  </ul>
               </div>
            </div>
            <div style="float: left">&#8592;&nbsp;<a class="NavigationArrow" href="offsiteblank.html">&#26696;&#20363;&#65306;Offsite Blank</a></div>
            <div style="text-align: right"><a class="NavigationArrow" href="frownies.html">&#26696;&#20363;&#65306;Frownies</a>&nbsp;&#8594;
            </div>
            <hr style="clear:both">
            <div class="footer">
               <p class="copyright">&#29256;&#26435; &copy; 2005 Mark Pilgrim &middot; <a title="&#21457;&#36865;&#32473;&#25105;&#26377;&#20110;&#27492;&#20070;&#30340;&#21453;&#39304;&#24847;&#35265;" href="mailto:mark@diveintomark.org">mark@diveintomark.org</a> &middot; <a href="../license/gpl.html" title="GNU &#36890;&#29992;&#20844;&#20849;&#35768;&#21487;&#35777;">&#20351;&#29992;&#26465;&#27454;</a></p>
            </div>
         </div>
      </div>
   </body>
</html>